package cn.com.bluemoon.daps.common.datascope.log;

import cn.com.bluemoon.daps.common.datascope.log.enums.ModuleObject;
import cn.com.bluemoon.daps.common.datascope.log.enums.OperateType;
import cn.com.bluemoon.daps.common.datascope.log.impl.DefaultAfterLogServiceImpl;
import cn.com.bluemoon.daps.common.datascope.log.impl.DefaultBeforeLogServiceImpl;
import cn.com.bluemoon.daps.common.datascope.log.impl.DefaultProcessLogServiceImpl;

import java.lang.annotation.*;

/**
 * 1.当@OperateLog和@BmPermission注解同时使用，OperateLog中的菜单名称menuName属性可不填(填了不生效)，
 * 后端会根据BmPermission中的value属性获取菜单名。
 * 2.当@OperateLog单独使用，需自定义菜单名称
 * 3.@OperateLog中before、process、after属性表示执行前、执行中、执行后三个时间点可追加日志内容，实现ILogService接口即可
 * 4.在使用@OperateLog注解的方法中可以追加日志,ProcessLogHolder.append("xxxx");
 * 局限性：当@OperateLog和@IgnorePermission同时使用时，日志记录内容获取不到用户信息，因为@IgnorePermission注解就是接口放权，
 * 不做任何限制，不建议一起使用
 **/
@Target(ElementType.METHOD)//表示用于标识方法
@Retention(RetentionPolicy.RUNTIME)//表示运行时保留
@Inherited
public @interface OperateLog {
    /**
     * 操作类型
     */
    OperateType type() default OperateType.UNKNOWN;

    /**
     * 数据标/主题
     * 操作的功能模块
     */
    ModuleObject moduleName() default ModuleObject.UNKNOWN;

    /**
     * 操作的菜单名称（模块下的菜单）
     */
    String menuName() default "";

    /**
     * 主要是标志日志的描述信息
     */
    String detail() default "";

    /**
     * 自定义日志（调用方法前）
     */
    Class<? extends ILogService> before() default DefaultBeforeLogServiceImpl.class;

    /**
     * 自定义日志（调用方法中）
     * <p>
     * 默认通过{@link cn.com.bluemoon.daps.common.datascope.log.holder.ProcessLogHolder}进行收集
     */
    Class<? extends ILogService> process() default DefaultProcessLogServiceImpl.class;

    /**
     * 自定义日志（调用方法后）
     */
    Class<? extends ILogService> after() default DefaultAfterLogServiceImpl.class;


}
